// TODO:在完成账号绑定后，追加写入设备id
const serverIp = "192.168.137.1";               // 服务器ip
const savePath = "/sdcard/Download/";

let width =  1080;
let height =  2340;
let _deviceModel = "9";
if(device.model.includes("5")){
    // TODO:修改为m5设备
    width = 1080
    height = 1920
    _deviceModel = "5"
}




const config = {

    url: "http://" + serverIp,                  // 请求前置url，正式请求需要自行在后续添加
    resourceUrl: "http://" + serverIp + "/resource",     // 资源请求前缀
    savePath: savePath,                               // 文件总目录
    errFilePath: savePath + "err.txt",                   // 错误信息保存的文件
    jsDir: savePath + "js/",                       // 脚本文件存放目录
    jsUploadDir: savePath + "js/" + "upload/",           // 上传脚本文件的目录
    videoDir: savePath + "video/",                    // 视频路径
    timeOut: 10,                                     // 超时时间
    deviceWidth : width,          // 设备宽度
    deviceHeight : height,        // 设备长度
    device_id: deviceId,
    device_model: _deviceModel,
    /**
     * *************************************
     * ************ 函数部分 ****************
     * *************************************
     */
    /**
     * @function randomSleep()
     * 随机延时0.5s-2s
     */
    randomSleep: function () {
        sleep(random(500, 5000))
    },

    /**
     * @description 等待config中设置的timeout秒，找到后使用坐标点击
     * @param {uiselector} selectItem 选择的控件
     * @param {number} time (可为空) timeout的除数 
     * @param {uiselector or UiObject} item (可为空) selectItem只是标志控件，则点击item，并设置超时时间为一半；可传入uiobject而不是uiselect
     * @returns {boolean} flag
     * [object UiObject] | [object JavaObject]
     */
    waitForAndClick: function (selectItem, time, item) {
        try{
            // 先随机等待0.5s~2s
            if (time == null) {
                time = 1;
            }
            randomSleep()
            var flag = false;
            for (var i = 0; i < config.timeOut / time; i++) {
                if (selectItem.exists()) {
                    var itemBounds = selectItem.findOne().bounds();
                    if (item != null) {
                        if ( item.getClass().getName().includes("UiObject") ) {
                            itemBounds = item.bounds()
                        } else {
                            itemBounds = item.findOne().bounds();
                        }
                    }

                    click(itemBounds.centerX(), itemBounds.centerY());
                    flag = true;
                    break;
                }
                sleep(1000);
            }
            randomSleep()
            return flag;
        }catch(e){
            errUpload.httpUploadErrMsg("执行异常：waitForAndClick => "+e)
        }
        
    },


    /**
     * @description 等待config中设置的timeout秒，找到后设置文本；该方法使用的是setText，可能会被检测，最好使用paste方法。
     * @param {uiselector} selectItem 所选控件
     * @param {string} text 待设置的文本
     * @param {number} time (可为空) timeout的除数 
     * @param {uiselector} item (可为空) selectItem只是标志控件，则点击item，并设置超时时间为一半
     * @returns {boolean} flag
     */
    waitForAndSetText: function (selectItem, text, time, item) {
        try{
            // 先随机等待0.5s~2s
            if (time == null) {
                time = 1;
            }
            randomSleep()
            var flag = false;
            for (var i = 0; i < config.timeOut / time; i++) {
                if (selectItem.exists()) {
                    var temp = selectItem.findOne();
                    if (item != null) {
                        temp = item.findOne();
                    }

                    temp.setText(text)
                    flag = true;
                    break;
                }
                sleep(1000);
            }
            randomSleep()
            return flag;
        }catch(e){
            errUpload.httpUploadErrMsg("执行异常：waitForAndSetText => "+e)
        }
    },

    /**
     * @description 退出应用并退出脚本文件
     * @desc 耗时：3.5s+
     */
    exitAppAndJs: function (msg) {
        try{
            toastLog("退出！")
            sleep(1000)
            recents()
            sleep(1000)
            gesture(5, [deviceWidth / 2, deviceHeight / 2 + deviceHeight / 4], [deviceWidth / 2, deviceHeight / 2 - deviceHeight / 4])
            sleep(500)
            home()
            sleep(500)
            home()
            if(msg !== null || msg !== undefined || msg !== ""){
                errUpload.httpUploadErrMsg(msg)
            }
            
            exit()
        }catch(e){
            errUpload.httpUploadErrMsg("执行异常：exitAppAndJs => "+e)
        }
    },

    /**
     * @description 在上传完成后，平台会在媒体文件中保存资源，会影响后续上传，故在上传结束后需要删除
     * @param {String} appName 
     */
    deleteDirCache: function (appName) {
        try{
            files.removeDir("/sdcard/Movies/" + appName + "/")
            files.removeDir("/sdcard/Pictures/" + appName + "/")
            media.scanFile("/sdcard/Movies/" + appName + "/")
            media.scanFile("/sdcard/Pictures/" + appName + "/")
        }catch(e){
            errUpload.httpUploadErrMsg("执行异常：deleteDirCache => "+e)
        }
    },

    /**
     * 切换键盘，切换为系统键盘。
     */
    changeKeyboard: function(){
        if(_deviceModel === "9"){
            click(10*width / 11 ,24*height / 25);
            sleep(500);
            click(width /2 ,height / 2);
        }else{
            // TODO:m5切换键盘，底部没有切换键盘的快捷按钮


        }

    }


}

const func = {
     /**
     * @description 进行post请求服务器
     * @param {string} urlPath 请求路径
     * @param {json} uploadData 必须是json格式的数据
     */
     httpPostData_JSON: function(urlPath, uploadData){
        try{
            // 如果uploadData不为null，则添加deviceId
            if(uploadData != null){
                uploadData.deviceId = deviceId
            }else{
                uploadData = {
                    "deviceId": deviceId
                }
            }
            var res = http.post(config.url+urlPath,uploadData);
            return res.body.json();
        }catch(e){
            errUpload.httpUploadErrMsg("执行异常：httpPostData_JSON => "+e)
        }
    },

    /**
     * @description 向服务器下载文件
     * @param {string} url 资源url 
     * @param {string} dir 保存文件夹，保存在/sdcard/download下，形式如“js/test.js”
     * @returns {flag} true or false
     */
    httpGetFile_Bytes: function(url, dir){
        try{
            var res = http.get(url);
            const resBytes = res.body.bytes();
            var flag = false;

            files.writeBytes(config.savePath + dir, resBytes);
            if (files.exists(config.savePath + dir)) {
                flag = true;
            } else {
                toastLog("文件下载失败。");
            } 

            return flag;
        }catch(e){
            errUpload.httpUploadErrMsg("执行异常：httpGetFile_Bytes => "+e)
        }
    },

    /**
     * 下载js文件，并解压
     * @return 0为成功
     */
    httpDownLoadingJS: function(){
        try{
            var resBytes = http.get(config.resourceUrl + "/js.rar").body.bytes();
            files.writeBytes(config.jsDir + "js.rar", resBytes);
            if (files.exists(config.jsDir + "js.rar")) {
                
            } else {
            
                return -1
            } 
            return zips.X(config.jsDir + "js.rar" , config.jsDir);
        }catch(e){
            errUpload.httpUploadErrMsg("执行异常：httpDownLoadingJS => "+e)
        }
    },

    

    /**
     * 随机获取一首歌名
     * @returns {string} 歌名 | 歌手
     */
    getRandomSong:function(){
        try{
            if(files.exists(savePath + "songs.txt")){
                var songs = files.read(savePath + "songs.txt")
                var lines = songs.split('\n');
                var randomLine = lines[Math.floor(Math.random() * lines.length)];
                return randomLine;
            }else{
                // TODO: 默认歌曲
                return ""
            }
        }catch(e){
            errUpload.httpUploadErrMsg("执行异常：getRandomSong => "+e)
        }
    },

    getTranslateTitle: function(){
        try{
            var data = JSON.parse(files.read(jsDir + "data.txt"))
            if(data.translateTitle === undefined){
                data.translateTitle = data.title
            }
            return data.translateTitle
        }catch(e){
            errUpload.httpUploadErrMsg("执行异常：getTranslateTitle => "+e)
        }
    },


    /**
     * 点击搜索
     * @desprete
     */
    clickConfirm: function(){
        // 如果是m9设备
        if(_deviceModel === "9"){
            click(980,2140)
            sleep(500)
            click(980,1980)
        }else{
            click(900,1850)
            sleep(1000)
            click(900,1700)
        }
    }
}

const errUpload = {
    /**
     * 
     * @param {string} msg 错误信息
     */
    httpUploadErrMsg: function(msg){
        var data =""
        if(files.exists(jsDir+"data.txt")){
            data = JSON.parse(files.read(jsDir+"data.txt"))
        }else{
            data = null
        }
        var time = formatDate(new Date())
        http.post(config.url + "/device/upload/errMsg",{
            "deviceId": deviceId,
            "createTime": time,
            "msg": msg,
            "videoId": data.id
        })
        var text = "时间："+time
                +"\n错误信息："+msg
                +"\n\n"
        
        
        files.append(config.errFilePath, text)
    },
}


const temp = Object.assign({}, config, func, errUpload);

module.exports = temp;

/**
 * 时间格式化
 * @param {Date} date 
 * @returns 
 */
function formatDate(date) {
    var year = date.getFullYear();
    var month = (1 + date.getMonth()).toString().length === 1 ? '0' + (1 + date.getMonth()).toString() : (1 + date.getMonth()).toString(); // 月份从0开始，需要加1
    var day = date.getDate().toString().length === 1 ? '0' + date.getDate().toString() : date.getDate().toString();
    var hours = date.getHours().toString().length === 1 ? '0' + date.getHours().toString() : date.getHours().toString();
    var minutes = date.getMinutes().toString().length === 1 ? '0' + date.getMinutes().toString() : date.getMinutes().toString();
    var seconds = date.getSeconds().toString().length === 1 ? '0' + date.getSeconds().toString() : date.getSeconds().toString();

    return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
}

